home *** CD-ROM | disk | FTP | other *** search
/ Aminet 45 / Aminet 45 (2001)(GTI - Schatztruhe)[!][Oct 2001].iso / Aminet / dev / e / 2b_CrtvE_src.lha / address.s next >
Text File  |  2001-01-29  |  11KB  |  514 lines

  1. ;;ADDRESS
  2.  
  3. ; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
  4. ;   The Calculate-Addresses-For-BRAnches Part                   ;
  5. ; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;
  6.  
  7.  
  8. CALCADR:
  9.     MOVE.W  #10,CURSPOT
  10.     MOVE.L  CURACODE(PC),A4     ; A4=CODE
  11.     MOVE.L  A5,-(A7)
  12.     MOVE.L  HunkList(PC),A5
  13.     move.l  A4,H_END(A5)
  14.     MOVe.L  (a7)+,A5
  15.     MOVE.L  ACODE(PC),D2
  16.     MOVE.L  A4,D4
  17.     BTST    #1,D4
  18.     BEQ.S   .1
  19.     CLR.W   (A4)+
  20.     MOVE.L  A4,D4
  21. .1: SUB.L   D2,D4
  22.     MOVE.L  D4,CODEAMOUNT       ; CLEANOFF AND SET CODESIZE
  23.     MOVE.L  D2,D7           ; D7=START CODE
  24.  
  25.     MOVEM.L D0-A6,-(A7)
  26.     BSR CALLLIBFUNC
  27.     MOVem.l (A7)+,D0-A6
  28.  
  29.     TSTMOD
  30.     BNE.S   .NM
  31.     BTST    #5,CODEPREFS
  32.     BNE .NM
  33.     TST.W   MAINF
  34.     BEQ ERROR13
  35. .NM:LEA BRANCHLIST(PC),A5   ; A5=BRANCHES
  36.     MOVE.L  LABM+8(PC),A6       ; A6=LABELS
  37.     MOVE.L  CURLABNAME(PC),D0
  38.     LSL.L   #2,D0
  39.     ADD.L   A6,D0
  40.     MOVE.L  D0,LABM         ; SET USED
  41.     BSR PUTRELOC
  42. BRLOOP:
  43.     MOVE.L  (A5),A5
  44.     MOVE.L  A5,D0
  45.     BEQ.S   BROUT
  46.     MOVE.L  4(A5),A0        ; BRAnch spot
  47.     MOVEQ   #0,D0
  48.     MOVE.W  8(A5),D0
  49.     BEQ.S   BROUT
  50.     LSL.L   #2,D0
  51.     MOVE.L  0(A6,D0.L),D2       ; BRAnch to
  52.     BTST    #0,1(A0)        ; IF BIT=1 --> .B OR .L RELOC
  53.     BNE.S   OTHERRELOC
  54.  
  55.     BSR THRUHUNKS
  56.     TST.L   D0
  57.     BNE     ERROR44
  58.  
  59.     SUB.L   A0,D2
  60.  
  61.     CMP.W   #1,10(A5)
  62.     BNE .1
  63.     ADDQ.L  #2,D2
  64. ;    ADDQ.L  #2,A0
  65. .1:
  66.     CMP.L   #$7FF0,D2
  67.     BPL ERROR44
  68.     CMP.L   #-$7FF0,D2
  69.     BMI ERROR44
  70.     MOVE.W  D2,(A0)
  71.     BRA.S   BRLOOP
  72. BROUT:
  73.     MOVE.L  NUMRELOC,D0
  74.     BEQ.S   .1
  75.     CLR.L   (A4)+
  76.     MOVE.L  NUMRELADR,A0
  77.     MOVE.L  D0,(A0)
  78. .1: BSR BUILDSYMHUNK
  79.     MOVE.L  A4,CURACODE     ; SET BACK.
  80.     RTS
  81. OTHERRELOC:
  82.     BTST    #3,1(A0)
  83.     BNE     XLONG
  84.     BNE ERROR45
  85.     BTST    #1,1(A0)
  86.     BNE     LONG
  87.     BSR THRUHUNKS
  88.     TST.L   D0
  89.     BTST    #2,1(A0)        ; 8 bit pcrel
  90.     BEQ.S   .1
  91.     SUBQ.L  #2,D2
  92. .1: SUB.L   A0,D2
  93.     BEQ ERROR45
  94.     CMP.L   #120,D2
  95.     BPL ERROR45
  96.     CMP.L   #-120,D2
  97.     BMI ERROR45
  98.     MOVE.B  D2,1(A0)        ; PTR A0 = RELOCEND-2
  99.     BRA BRLOOP
  100.  
  101. LONG:
  102.     TSTMOD                  ; ALL MODULES linked to hunk #0!
  103.     BNE     .3
  104.     BSR     FINDNFIX            ; NOT allowed in modules!
  105.     BRA BRLOOP
  106. .3:
  107.     BSR INCRELOC
  108.     TST.W   2(A0)           ; SEE IF THERE'S EFUNCNUM
  109.     BNE.S   .2
  110.     SUB.L   D7,D2           ; D7=start asm code
  111.     MOVE.L  D2,(A0)         ; d2=destination
  112.     SUB.L   D7,A0           ; a0=source
  113.     MOVE.L  A0,(A4)+
  114.     BRA BRLOOP
  115. .2:
  116.     SUB.L   D7,A0           ; EFUNC CALL, BIT #32 SET.
  117.     MOVE.L  A0,D0
  118.     MOVEQ   #31,D2
  119.     BSET    D2,D0
  120.     MOVE.L  D0,(A4)+
  121.     BRA BRLOOP
  122.  
  123. INCRELOC:
  124.     TST.L   NUMRELOC        ; 32BIT RELOC
  125.     BNE.S   .1
  126.     MOVE.L  #$3EC,(A4)+
  127.     MOVE.L  A4,NUMRELADR
  128.     ADDQ.L  #4,A4
  129.     MOVE.L  A4,RELOCTABSTART
  130.     CLR.L   (A4)+
  131. .1: ADDQ.L  #1,NUMRELOC
  132.     RTS
  133.  
  134. XLONG:
  135.     BTST    #1,1(A0)
  136.     BNE     .XRELOC
  137.     SUB.L   A0,D2
  138.     CMP.W   #1,10(A5)
  139.     BNE .1
  140.     ADDQ.L  #2,D2
  141. .1:
  142.     MOVE.L  D2,(A0)
  143.     BRA     BRLOOP
  144. .XRELOC:
  145.     MOVE.L  10(A5),D2
  146.     ADD.L   D7,D2
  147.     BSR     FINDNFIX
  148.     BRA     BRLOOP
  149.  
  150. ;    MOVE.L  10(a5),(a0)
  151. ;    BSR INCRELOC
  152. ;    SUB.L   D7,A0
  153. ;    MOVE.L  A0,(A4)+
  154. ;    BRA     BRLOOP
  155. ;; ThruHunks - check if reference is between two hunks
  156. THRUHUNKS:          ; D2 = dest, A0 = src
  157.     MOVEM.L D1-A6,-(A7)
  158.     MOVE.L  HunkList(PC),D0
  159. .1: MOVE.L  D0,A1
  160.     CMP.L   H_ADDR(A1),D2
  161.     BGE     .2
  162.     MOVE.L  H_NEXT(A1),D0
  163.     BRA     .1
  164. .2: MOVE.L  A0,D1
  165.     CMP.L   H_ADDR(A1),D1
  166.     BMI     .3
  167.     CMP.L   H_END(A1),D1
  168.     BGE     .3
  169.     MOVEQ   #0,D0
  170.     MOVEm.L (A7)+,D1-A6
  171.     RTS
  172. .3: MOVEQ   #-1,D0
  173.     MOVEm.L (A7)+,D1-A6
  174.     rts
  175. ;*-*
  176. ;; FindNFix - sth like INCRELOC, but for multiple hunks
  177. FINDNFIX:           ; D7 = acode, D2 = dest, A0 = src
  178.     MOVEM.L D0-A6,-(A7)
  179.     TSTMOD
  180.     BEQ     .NORMAL
  181.     BSR INCRELOC
  182.     SUB.L   A0,D2
  183.     MOVE.L  D2,(A0)
  184.     MOVE.L  A0,(A4)+
  185.     BRA     .XIT
  186. .NORMAL:
  187.     MOVE.L  NumHunks(PC),D1
  188.     SUBQ.L  #1,D1
  189.     MOVE.L  HunkList(PC),D0     ; adresses from the last to the first
  190. .1: MOVE.L  D0,A1
  191.     CMP.L   H_ADDR(A1),D2
  192.     BGE     .FND
  193.     SUBQ.L  #1,D1               ; next hunk
  194.     MOVE.L  H_NEXT(A1),D0
  195.     BEQ     ERROR57
  196.     bra     .1
  197. .FND:                           ; here we have the hunk number :)
  198.     MOVE.L  A1,A3               ; and the offset of REAL start
  199.     MOVE.L  HunkList(PC),D0     ; now the hunk where to put the reloc
  200. .2: MOVE.L  D0,A1
  201.     CMPA.L  H_ADDR(A1),A0
  202.     BGE     .FND2
  203.     MOVE.L  H_NEXT(A1),D0
  204.     BEQ ERROR57
  205.     bra     .2
  206. .FND2:
  207.     MOVE.L  H_ADDR(A3),D0
  208.     SUB.L   D0,D2
  209.     MOVE.L  D2,(A0)
  210.     GETM    A2
  211.     MOVE.L  H_RELO(A1),(A2)+
  212.     MOVE.L  A2,H_RELO(A1)
  213.     MOVE.W  D1,(A2)+
  214.     SUB.L   H_ADDR(A1),A0
  215.     MOVE.L  A0,(A2)+            ; ta daaa!
  216.     DONEM   A2
  217. .XIT
  218.     MOVEM.L (A7)+,D0-A6         ; filled! :)
  219.     RTS
  220. ;*-*
  221. ;; CallLibFunc
  222. CALLLIBFUNC:
  223.     LEA LIBPTRS+4,A0
  224. .LOOP:
  225.     MOVE.L  -4(A0),D0
  226.     BEQ     .EXIT
  227.     MOVE.L  D0,A0
  228.     MOVE.L  4(A0),A1
  229.     MOVE.L  14(A1),D0
  230.     MOVE.L  (A0),A1
  231.  
  232.     CMP.W   #1,8(A0)
  233.     BEQ     .LONG
  234.  
  235.     SUB.L   A1,D0
  236.     SUBQ.L  #2,D0
  237.  
  238.  
  239.     SWAP    D0
  240.     TST.W   D0
  241.     BNE     ERROR44
  242.     SWAP    D0
  243.     MOVE.L  (A0),A1
  244.     MOVE.W  D0,2(A1)
  245.     BRA     .LOOP
  246. .EXIT:
  247.     RTS
  248. .LONG:
  249.     MOVE.L  A0,-(A7)
  250.     MOVE.L  D2,-(A7)
  251.     MOVE.L  A1,A0
  252.     ADDQ.L  #2,A0
  253.     MOVE.L  D0,D2
  254.     BSR FINDNFIX
  255.     MOVe.L  (A7)+,D2
  256.     MOVE.L  (A7)+,A0
  257.     BRA .LOOP
  258.  
  259. ;    SUB.L   D7,D0
  260. ;    MOVE.L  D0,2(A1)
  261. ;    SUb.L   D7,A1
  262. ;    addq.l  #2,a1
  263. ;    BSR INCRELOC
  264. ;    MOVE.L  A1,(A4)+
  265. ;    BRA .LOOP
  266.  
  267. ;*-*
  268.  
  269. NUMRELOC:   DC.L    0
  270. NUMRELADR:  DC.L    0
  271. LIBPTRS:    DC.L    0
  272.  
  273. ; LAST RELOC BYTE:
  274. ; <0xx0> BIT #0 CLR -->                PCREL RELOC16
  275. ; <0001>        SET --> BIT #1 CLR --> PCREL RELOC8
  276. ; <0101>        SET --> BIT #1 CLR --> PCREL RELOC8 + ADJUST
  277. ; <0x11>                       SET --> ABS   RELOC32 (ENTRY IN RELOCTAB)
  278. ; <1001> BIT #0 SET --> BIT #1 CLR --> PCREL RELOC32
  279.  
  280.  
  281. DIVRELOC: DC.L    0
  282.  
  283. ADDDIVRELOC:          ; ADR=D0
  284.     MOVE.L  A0,-(A7)
  285.     GETM    A0
  286.     MOVE.L  DIVRELOC(PC),(A0)
  287.     MOVE.L  A0,DIVRELOC
  288.     ADDQ.L  #4,A0
  289.     MOVE.L  D0,(A0)+
  290.     DONEM   A0
  291.     MOVE.L  (A7)+,A0
  292.     RTS
  293.  
  294. PUTRELOC:
  295.     MOVEM.L A0-A3/A6/D0-D7,-(A7)    ; EXPECTS CODE IN A4
  296.     LEA CODELIST(PC),A0     ; A0=CODEREM
  297.     MOVE.L  LABM+8,A2       ; A2=LABELS
  298. .XL:MOVE.L  (A0),A0
  299.     MOVE.L  A0,D0
  300.     BEQ.S   .E
  301.     CMP.W   #3,4(A0)
  302.     BNE.S   .LL
  303.     MOVE.L  6(A0),A3        ; A3=RELOCTAB
  304.     MOVE.L  10(A0),D3       ; D3=RELOCLEN
  305.     SUBQ.L  #1,D3
  306. .RL:MOVE.L  (A3)+,D2
  307.     BMI.S   .P
  308. ;    BSR INCRELOC
  309.     ADD.L   D1,D2           ; ADD OFFSET IN D1
  310.  
  311.     MOVEM.L D2/d7/A0,-(A7)
  312.     MOVE.L  ACODE(PC),D7
  313.     ADD.L   D7,D2
  314.     MOVE.L  D2,A0
  315.     MOVE.L  (A0),D2
  316.     ADD.L   D7,D2
  317.     BSR     FINDNFIX
  318.     MOVEM.L (A7)+,D2/d7/A0
  319.  
  320. ;    MOVE.L  D2,(A4)+
  321. .P: DBRA    D3,.RL
  322.     BRA     .XL
  323. .E: LEA DIVRELOC(PC),A2     ; ADD SOME VARIOUS RELOCS
  324.     MOVE.L  ACODE,D7
  325. .DL:MOVE.L  (A2),D0
  326.     BEQ.S   .DX
  327.     MOVE.L  D0,A2
  328.     MOVE.L  D0,A0
  329.     MOVE.L  4(A0),A0
  330.     MOVE.L  (A0),D2
  331.     ADd.L   D7,D2
  332.     BSR FINDNFIX
  333.     BRA.S   .DL
  334. .DX:    MOVEM.L (A7)+,A0-A3/A6/D0-D7
  335.     RTS
  336. .LL:CMP.W   #2,4(A0)
  337.     BNE.S   .PROC
  338.     MOVE.L  10(A0),D1       ; D1=ADD OFFSET
  339.     SUB.L   ACODE,D1
  340.     BRA.S   .XL
  341.  
  342. .PROC:
  343.     CMP.W   #5,4(A0)
  344.     BNE   .XL
  345.     MOVE.L  6(A0),A1
  346.  
  347.     MOVE.L  A1,D0
  348.     HASH    A1,D2,D7
  349.     LSL.L   #2,D2
  350.     ADD.L   #IDENTHASH+4,D2
  351.     MOVE.L  D2,A3
  352. .SL:    MOVE.L  -(A3),A3
  353.     MOVE.L  A3,D2
  354.     BEQ.S   .NOTF
  355.     CMP.B   #LAB,4(A3)
  356.     BNE.S   .SL
  357.     MOVE.L  (A3),A1
  358.     MOVE.L  D0,A6
  359. .CL:    CMPM.B  (A1)+,(A6)+
  360.     BNE.S   .SL
  361.     TST.B   -1(A1)
  362.     BNE.S   .CL
  363.     MOVE.L  10(A0),A1
  364.     MOVE.L  6(A3),D7
  365.     BEQ.S   .SK
  366.     MOVE.L  D7,A6
  367.     MOVE.W  (A1),D7
  368.     CMP.W   (A6),D7
  369.     BNE.S   .SL
  370. .SK:    ADDQ.L  #2,A1
  371.     MOVE.W  (A1)+,D3
  372.     BEQ.W   .XL
  373.     SUBQ.W  #1,D3
  374.     MOVEQ   #0,D2
  375.     MOVE.W  10(A3),D2
  376.     LSL.L   #2,D2
  377.     MOVE.L  0(A2,D2.L),D2
  378.     MOVE.L  ACODE,D7
  379.     SUB.L   D7,D2
  380.  
  381. .PPL:   MOVE.L  (A1)+,A6
  382.     ADD.L   D1,A6
  383.  
  384.     MOVEM.L D2/A0,-(A7)
  385.     MOVE.L  A6,A0
  386.     ADD.L   D7,A0
  387.     ADD.L   D7,D2
  388.     BSR     FINDNFIX
  389.     MOVEM.L (A7)+,D2/A0
  390.     DBRA    D3,.PPL
  391.     BRA.W   .XL
  392.  
  393. .NOTF:  MOVE.L  D0,ERROROBJ
  394.     BRA ERROR57
  395.  
  396. BUILDSYMHUNK:         ; GETS CODE IN A4
  397.     MOVEM.L D0-D7/A0-A3/A5/A6,-(A7)
  398.     BTST    #5,CODEPREFS+2
  399.     BEQ NOSYM
  400.     TSTMOD
  401.     BNE NOSYM
  402.     MOVE.L  A4,SYMADDR
  403.     MOVE.L  LABM+8,A0       ; A0=LABELBUF
  404.     MOVE.L  ACODE,D3        ; D3=ACODE
  405.     MOVEQ   #0,D0           ; D0=NUMSYMS
  406.     MOVE.L  #IDENTHASH+4,D6
  407.     MOVE.L  #IDENTHASH+1028,D7  ; D6,D7=IDENTBUF,END
  408. .OLOOP: MOVE.L  D6,A5           ; A5=IDENTPTR
  409.     ADDQ.L  #4,D6
  410.     CMP.L   D6,D7
  411.     BEQ ESYMS
  412. .LOOP:  MOVE.L  -(A5),A5
  413.     MOVE.L  A5,D4           ; D4=DUMMY
  414.     BEQ.S   .OLOOP
  415.     CMP.B   #LAB,4(A5)
  416.     BNE.S   .LOOP
  417.     BTST    #4,5(A5)
  418.     BNE.S   .LOOP           ; SKIP METHODS
  419.     ;TST.L  6(A5)
  420.     ;BEQ.S  .LOOP           ; skip labels yesorno?
  421.     TST.L   D0          ; FIRST SYM, START HUNK
  422.     BNE.S   .NF
  423.     MOVE.L  #$3F0,(A4)+
  424. .NF:CLR.L   (A4)+
  425.     MOVE.L  A4,A6           ; A6=BACKPATCH
  426.     MOVE.L  (A5),A2         ; A2=ASCII
  427. .CL:MOVE.B  (A2)+,(A4)+
  428.     BNE.S   .CL
  429.     MOVE.L  A4,D4
  430.     BTST    #0,D4
  431.     BEQ.S   .1
  432.     ADDQ.L  #1,D4
  433. .1: BTST    #1,D4
  434.     BEQ.S   .2
  435.     ADDQ.L  #2,D4
  436. .2: MOVE.L  D4,A4
  437.     SUB.L   A6,D4
  438.     LSR.L   #2,D4
  439.     MOVE.W  D4,-2(A6)
  440.     MOVEQ   #0,D1
  441.     MOVE.W  10(A5),D1       ; LABEL-ID
  442.     LSL.L   #2,D1
  443.     MOVE.L  0(A0,D1.L),D1
  444.     SUB.L   D3,D1
  445.     MOVE.L  D1,(A4)+
  446.     ADDQ.L  #1,D0
  447.     BRA .LOOP
  448. ESYMS:
  449.     MOVE.L  #EFUNCBYTE,A3
  450.     MOVE.W  #NREFUNC,D2
  451.     SUBQ.W  #1,D2
  452.     MOVE.L  #EFUNCTAB,D7
  453.     MOVEQ   #0,D6
  454. .3: TST.B   (A3)+
  455.     BEQ.S   .4
  456.  
  457.     MOVE.L  D6,D5
  458.     LSL.W   #1,D5
  459.     LEA     EFUNCFLAGSTAB,A1
  460.     MOVE.W  0(A1,D5),D5
  461.     BTST    #8,D5
  462.     BNE     .4
  463.  
  464.     MOVE.L  D7,A1
  465.     MOVE.L  d6,D5
  466.     MULU    #EFUNCENTRYSIZE,D5
  467.     ADD.L   D5,A1           ; (a1)=ptr ascii
  468.  
  469.     TST.L   D0          ; FIRST SYM, START HUNK
  470.     BNE.S   .NF
  471.     MOVE.L  #$3F0,(A4)+
  472. .NF:CLR.L   (A4)+
  473.     MOVE.L  A4,A6           ; A6=BACKPATCH
  474.     MOVE.L  (A1),A2         ; A2=ASCII
  475. .CL:MOVE.B  (A2)+,(A4)+
  476.     BNE.S   .CL
  477.     MOVE.L  A4,D4
  478.     BTST    #0,D4
  479.     BEQ.S   .1
  480.     ADDQ.L  #1,D4
  481. .1: BTST    #1,D4
  482.     BEQ.S   .2
  483.     ADDQ.L  #2,D4
  484. .2: MOVE.L  D4,A4
  485.     SUB.L   A6,D4
  486.     LSR.L   #2,D4
  487.     MOVE.W  D4,-2(A6)
  488.     MOVE.L  D6,D1
  489.     ADD.L   #10,D1
  490.     LSL.L   #2,D1
  491.     MOVE.L  0(A0,D1.L),D1
  492.     SUB.L   D3,D1
  493.     MOVE.L  D1,(A4)+
  494.  
  495. .4: ADDQ.L  #1,D6
  496.     DBRA    D2,.3
  497.  
  498.     TST.L   D0
  499.     SNE     D0
  500.     EXT.W   D0
  501.     EXT.L   D0
  502.     AND.L   D0,SYMADDR
  503.     TST.L   D0
  504.     BEQ.S   NOSYM
  505.     CLR.L   (A4)+
  506.     MOVE.L  A4,SYMEND
  507. NOSYM:  MOVEM.L (A7)+,D0-D7/A0-A3/A5/A6
  508.     RTS
  509.  
  510.  
  511.  
  512. ;*-*
  513.  
  514.